/**
 * 消息提示工具函数
 * 基于 Taro.showToast 封装，提供更便捷的调用方式
 */

import Taro from '@tarojs/taro'

export interface ToastOptions {
  /** 提示内容 */
  title: string
  /** 图标 */
  icon?: 'success' | 'error' | 'loading' | 'none'
  /** 显示时长（毫秒） */
  duration?: number
  /** 是否显示遮罩层 */
  mask?: boolean
}

/**
 * 显示消息提示
 * @param options 提示选项
 */
export const showToast = (options: ToastOptions | string) => {
  const config = typeof options === 'string' ? { title: options } : options

  return Taro.showToast({
    title: config.title,
    icon: config.icon || 'none',
    duration: config.duration || 2000,
    mask: config.mask || false,
  })
}

/**
 * 显示成功提示
 * @param title 提示内容
 * @param duration 显示时长
 */
export const showSuccess = (title: string, duration?: number) => {
  return Taro.showToast({
    title,
    icon: 'success',
    duration: duration || 2000,
  })
}

/**
 * 显示错误提示
 * @param title 提示内容
 * @param duration 显示时长
 */
export const showError = (title: string, duration?: number) => {
  return Taro.showToast({
    title,
    icon: 'error',
    duration: duration || 2000,
  })
}

/**
 * 显示加载中
 * @param title 提示内容
 * @param mask 是否显示遮罩层
 */
export const showLoading = (title: string = '加载中...', mask: boolean = true) => {
  return Taro.showLoading({
    title,
    mask,
  })
}

/**
 * 隐藏加载中
 */
export const hideLoading = () => {
  return Taro.hideLoading()
}

/**
 * 隐藏消息提示
 */
export const hideToast = () => {
  return Taro.hideToast()
}

/**
 * 异步任务加载提示
 * @param task 异步任务
 * @param loadingText 加载提示文本
 * @param successText 成功提示文本
 * @param errorText 错误提示文本
 */
export const withLoading = async <T>(
  task: () => Promise<T>,
  loadingText: string = '加载中...',
  successText?: string,
  errorText?: string
): Promise<T> => {
  showLoading(loadingText)

  try {
    const result = await task()

    hideLoading()

    if (successText) {
      showSuccess(successText)
    }

    return result
  } catch (error) {
    hideLoading()

    if (errorText) {
      showError(errorText)
    } else if (error instanceof Error) {
      showError(error.message)
    } else {
      showError('操作失败')
    }

    throw error
  }
}

/**
 * 显示模态对话框
 * @param options 对话框选项
 */
export const showModal = (options: {
  title?: string
  content: string
  showCancel?: boolean
  confirmText?: string
  cancelText?: string
}): Promise<boolean> => {
  return new Promise((resolve) => {
    Taro.showModal({
      title: options.title || '提示',
      content: options.content,
      showCancel: options.showCancel !== false,
      confirmText: options.confirmText || '确定',
      cancelText: options.cancelText || '取消',
      success: (res) => {
        resolve(res.confirm)
      },
      fail: () => {
        resolve(false)
      },
    })
  })
}

/**
 * 显示操作菜单
 * @param items 菜单项
 */
export const showActionSheet = (items: string[]): Promise<number> => {
  return new Promise((resolve, reject) => {
    Taro.showActionSheet({
      itemList: items,
      success: (res) => {
        resolve(res.tapIndex)
      },
      fail: (error) => {
        reject(error)
      },
    })
  })
}

/**
 * 确认操作（避免与全局 confirm 冲突，使用 confirmDialog）
 * @param content 确认内容
 * @param title 标题
 */
export const confirmDialog = async (content: string, title: string = '确认'): Promise<boolean> => {
  return showModal({
    title,
    content,
    showCancel: true,
  })
}

/**
 * 警告提示
 * @param content 警告内容
 * @param title 标题
 */
export const alertDialog = async (content: string, title: string = '提示'): Promise<void> => {
  await showModal({
    title,
    content,
    showCancel: false,
  })
}

export default {
  showToast,
  showSuccess,
  showError,
  showLoading,
  hideLoading,
  hideToast,
  withLoading,
  showModal,
  showActionSheet,
  confirmDialog,
  alertDialog,
}

